input:
from keras.datasets import mnist
from keras.utils import np_utils
import numpy as np
np.random.seed(10)
output:
Using TensorFlow backend.
#資料預處理
input:
(x_Train,y_Train),(x_Test,y_Test)=mnist.load_data()#讀取資料
#下兩行將資料改為四維陣列(6000x28x28x1)
x_Train4D=x_Train.reshape(x_Train.shape[0],28,28,1).astype('float32')
x_Test4D=x_Test.reshape(x_Test.shape[0],28,28,1).astype('float32')
#下兩行將資料標準化
x_Train4D_normalize = x_Train4D/255
x_Test4D_normalize = x_Test4D/255
#下兩行將真實值以OneHot encoding轉換
y_TrainOneHot = np_utils.to_categorical(y_Train)
y_TestOneHot = np_utils.to_categorical(y_Test)
#建立模型
from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPooling2D
#建立線性堆疊模型
model = Sequential()
#建立卷積層1號
model.add(Conv2D(filters=16,#建立16個濾鏡filter weight
kernel_size=(5,5),#濾鏡大小為5x5
padding='same',#這一行讓影像大小不受卷積影像
input_shape=(28,28,1),#輸入影像為28x28(28,28)且是單色灰階影像(1)
activation='relu'))#激活函數為relu
#建立池化層1號
model.add(MaxPooling2D(pool_size=(2,2)))#28x28的影像會變成二分之一(16x16)
#建立卷積層2號
model.add(Conv2D(filters=36,
kernel_size=(5,5),
padding='same',
activation='relu',
))
#建立池化層2號
model.add(MaxPooling2D(pool_size=(2,2)))
#加入dropout避免overfitting
model.add(Dropout(0.25))#這邊會隨機放棄25%的神經元
#建立平坦層
model.add(Flatten())
#建立隱藏層
model.add(Dense(128,activation='relu'))
#加入dropout避免overfitting
model.add(Dropout(0.5))
#建立輸出層
model.add(Dense(10,activation='softmax'))
#輸出模型摘要
print(model.summary())
output:
#開始訓練
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
train_history=model.fit(x=x_Train4D_normalize,
y=y_TrainOneHot,
validation_split=0.2,
epochs=10,
batch_size=300,
verbose=2
)
output:
#建立show_train_history
import matplotlib.pyplot as plt#定義show_train_history(之前訓練產生的)(train_history,訓練執行結果,驗證資料執行結果)
def show_train_history(train_history,train,validation):
plt.plot(train_history.history[train])
plt.plot(train_history.history[validation])
plt.title('Train History')#圖形標題
plt.ylabel(train)#顯示y軸標籤
plt.xlabel('Epoch')#設定x軸標籤是'Epoch'
plt.legend(['train','validation'],loc='upper left')#設定圖例顯示'train','validation'在左上角
plt.show()
#畫出accuracy
show_train_history(train_history,'accuracy','val_accuracy')
#畫出loss
show_train_history(train_history,'loss','val_loss')
#顯示準確率
input:
scores=model.evaluate(x_Test4D_normalize,y_TestOneHot)
scores[1]
output:
10000/10000 [==============================] - 2s 216us/step
0.9912999868392944#準確率為0.99
#進行預測
prediction=model.predict_classes(x_Test4D_normalize)
prediction[:10]#顯示前十筆結果
output:
array([7, 2, 1, 0, 4, 1, 4, 9, 5, 9])
#建立plot_images_labels_prediction顯示圖片
def plot_images_labels_prediction(images,labels,prediction,idx,num=10):
#設定顯示圖片大小
fig=plt.gcf()
fig.set_size_inches(12,4)
#假如顯示比數超過25,設定為25以免發生錯誤
if num>25:num=25
for i in range(0,num):
ax=plt.subplot(5,5,1+i)#建立subgraph子圖形為5x5
ax.imshow(images[idx],cmap='binary')#畫出子圖形
title="label="+str(labels[idx])#設定子圖形的title,顯示標籤欄位
if len(prediction)>0:#如果有傳入預測結果
title+=",predict="+str(prediction[idx])#標題title加入預測結果
ax.set_title(title,fontsize=10)#設定子圖形的標題title和大小
ax.set_xticks([]);ax.set_yticks([])#設定為不顯示刻度
idx+=1#讀下一筆
plt.show()
#顯示前十筆資料的圖
plot_images_labels_prediction(x_Test,y_Test,prediction,idx=0)
#顯示混淆矩陣
import pandas as pd
pd.crosstab(y_Test,prediction,rownames=['label'],colnames=['predict'])
可以看到準確率比MLP高